%%--------------------------------------------------------------------------------------------------------------------------
%%山东师范大学信息科学与工程学院《计算智能》实验任务作业解析系列
%% Editor ：Qingke Zhang
%% Version：1.0
%--------------------------------------------------------------------------------------------------------------------------
%%                                 计算智能：实验任务（一）
%% 问题描述：问题描述 ：为客观公正分析智能优化算法A,B,C,D在求解国际基准测试函数F1最小数值问题上的性能优劣, 
% 实验时，研究者将上述四个算法在函数F1上各自分别独立重复运行10轮, 每一轮迭代评估次数为300000次(通过循环迭代寻找函数的最优解,
% 该解对应的函数数值记为适应度, 通过适应度数值间接衡量对应解的好坏). 各算法每次迭代搜索过程中得到的最优解的函数值分别保存在
% Results_A.mat,Results_B.mat,Results_C.mat,Results_D.mat文件内. 各文件均为10行300000列的数值矩阵, 该矩阵记录了
% 各个算法在10轮独立重复搜索过程中找到的全局最小值的数值变化过程. 请结合智能优化算法性能评估的相关知识, 基于上述四组收敛数据
% 结果对比分析算法A,B,C,D在求解函数F1最小数值问题上的性能差异.
%
%% 任务要求：请采用matlab模拟生成数据dataA和dataB（或基于真实算法生成），然后基于这两组数据分析比较算法的性能。
%--------------------------------------------------------------------------------------------------------------------------
%从表中提取智能优化算法A,B,C,D在10轮独立重复实验测试中获得的全局最佳适应度数值,并根据这些适应度数值计算算法收敛精度的均值mean和方差std.
%根据各算法得到的10个最佳收敛精度结果,绘制收敛精度统计箱图boxplot，要求图中至少包括图形标题，横坐标标题，纵坐标标题等内容，
%图片保存为png格式；绘制算法A,B,C,D在函数F1上的收敛曲线, 并采用不同的颜色、线型、和标记符号展示不同的算法收敛曲线(提示: ...
% 可借助plot函数叠加绘制算法收敛曲线)；基于算法A,B,C,D各自的10个最佳适应度数值结果,分析各算法求解结果在统计学上是否具有显着差异性
%(提示:可以借助ranksum函数获取统计结果)；
%--------------------------------------------------------------------------------------------------------------------------

clc;        %清空命令行
clear;      %清除之前的历史数据
close all;  % 关闭之前打开的图形窗口


%% 【一】、计算收敛精度数值
disp('-----------开始测试----------------');
disp('任务1：读取数据...');
%% 1. 读取测试实验数据
dataA=load("Results_A.mat");
dataB=load("Results_B.mat");
dataC=load("Results_C.mat");
dataD=load("Results_D.mat");

%% 2.获取算法A与算法B在每轮测试中获得的最佳收敛精度数据
Gbest_A = dataA.Gbest_History(:,end);%获取最后1列最优数据
Gbest_B = dataB.Gbest_History(:,end);%获取最后1列最优数据
Gbest_C = dataC.Gbest_History(:,end);%获取最后1列最优数据
Gbest_D = dataD.Gbest_History(:,end);%获取最后1列最优数据

Gbest=[Gbest_A,Gbest_B,Gbest_C,Gbest_D];
disp(Gbest)

%% 3. 计算每一行的统计量
meanGbest=mean(Gbest);%计算每一列的均值，得到行向量
stdGbest=std(Gbest);
maxGbest=max(Gbest,[],1);
minGbest=min(Gbest,[],1);
medianGbest=median(Gbest,1);


%% 4.输出统计量到表格

% 创建统计项目名称
staticItmes = {'均值'; '方差'; '最大'; '最小'; '中位数'};

% 创建统计值矩阵，每行对应一个统计量，每列对应一个算法
staticValues = [meanGbest; stdGbest; maxGbest; minGbest; medianGbest];


%创建表格
T = table(staticItmes, staticValues(:,1),staticValues(:,2),staticValues(:,3),staticValues(:,4),....
    'VariableNames', {'项目', '算法1', '算法2', '算法3','算法4'});

% 写入 Excel 文件
writetable(T, 'output.xlsx');


% -------------------------------------------------------------------------
% 【二】绘制收敛箱图（考察箱图的使用方法）
disp('任务2：绘制收敛箱图...');
pause(0.5);

figure(3);
%绘制图形
boxplot(Gbest);%

%添加修饰
title('统计箱图');
xlabel('测试算法');
ylabel('收敛精度');
xticklabels({'算法A','算法B','算法C','算法D'});

%保存箱图
saveas(gcf,'boxplot','png');

% -------------------------------------------------------------------------

% 【三】 绘制平均收敛曲线（考察矩阵运算与基本绘图）
disp('任务3：绘制收敛曲线...');
pause(0.5);

% 1. 获取迭代数据：计算历史进化过程中各代得到的最优适应度均值

historyA=mean(dataA.Gbest_History);
historyB=mean(dataB.Gbest_History);
historyC=mean(dataC.Gbest_History);
historyD=mean(dataD.Gbest_History);

% 2. 绘制收敛曲线
figure(4);
semilogy(historyA,'r-o','MarkerIndices',1:5000:300000);
hold on;
semilogy(historyB,'g-*','MarkerIndices',1:5000:300000);
hold on;
semilogy(historyC,'b-^','MarkerIndices',1:5000:300000);
hold on;
semilogy(historyD,'c->','MarkerIndices',1:5000:300000);

% 3. 图形修饰
title('收敛曲线');
xlabel('迭代次数');
ylabel('收敛精度');
legend('算法A','算法B','算法C','算法D');

% 4. 保存曲线
saveas(gcf,'convergence','png');

% 
% % -----------------------------------------------------------------------
% 【四】 显著性差异分析（考察统计分析方法及显著性假设检验的理解）
% 
p=zeros(1,4);h=zeros(1,4);
disp('任务4：算法性能显著性差异分析...');

for i=1:3
    [p(i),h(i)]=ranksum(Gbest(:,i),Gbest(:,end));
    disp(['p= ',num2str(p(i)),' h= ',num2str(h(i))]);
    if p(i)< 0.05
        disp(['结论：算法',num2str(i),'与算法4在该问题求解上具有显著性差异']);
    else
         disp(['结论：算法',num2str(i),'与算法4在该问题求解上不具有显著性差异']);
    end
end


disp('-----------测试完毕！----------------');
disp('温馨提示：按任意键可关闭所有图形窗口！');
close all;

